package br.com.treinamento.gestaoExperienciaProfissional.controller;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.primefaces.model.DualListModel;

import br.com.treinamento.gestaoExperienciaProfissional.model.Grupo;
import br.com.treinamento.gestaoExperienciaProfissional.model.Pessoa;
import br.com.treinamento.gestaoExperienciaProfissional.model.Usuario;
import br.com.treinamento.gestaoExperienciaProfissional.service.GrupoService;
import br.com.treinamento.gestaoExperienciaProfissional.service.PessoaService;
import br.com.treinamento.gestaoExperienciaProfissional.service.UsuarioService;
import br.com.treinamento.gestaoExperienciaProfissional.util.FacesUtil;

import com.google.common.base.Strings;

@ManagedBean
@ViewScoped
public class UsuarioController implements Serializable {

	private static final long serialVersionUID = 5483845222493117761L;

	private UsuarioService usuarioService = new UsuarioService();
	private GrupoService grupoService = new GrupoService();
	private PessoaService pessoaService = new PessoaService();
		
	private Usuario usuario;
	private List<Usuario> usuarios;
	private List<Pessoa> pessoas;

	private DualListModel<Grupo> grupos;
	
	private String palavraChave;
	
	@PostConstruct
	public void init() {
    	if(isAlteracao()) {
    		alterarUsuario();
    	} else {
    		novoUsuario();
    	}
	}
	
	private boolean isAlteracao() {
		String idUsuario = FacesUtil.getRequestParameter("idUsuario");
		return !Strings.isNullOrEmpty(idUsuario);
	}

	private void novoUsuario() {
		usuario = new Usuario();
		grupos = new DualListModel<Grupo>(grupoService.listar(), new ArrayList<Grupo>());
	}

	public String salvar() throws IOException {
		usuario.setGrupos(grupos.getTarget());
		usuarioService.salvar(this.usuario);
		FacesUtil.mostrarMensagemSucesso("msg.cadastro.sucesso");
		return "/paginas/usuario/listarUsuario";
	}

	public List<Pessoa> completarPessoa(String valor) {
		List<Pessoa> sugestao = new ArrayList<Pessoa>();
		for (Pessoa pessoa : getPessoas()) {
			if (pessoa.getNome().toLowerCase().contains(valor.toLowerCase()))
				sugestao.add(pessoa);
		}
		return sugestao;
	}
	
	public void excluir(Usuario usuario){
		usuarioService.excluir(usuario);
    	listarUsuarios();
    	FacesUtil.mostrarMensagemSucesso("usuario.excluido.sucesso");
	}
	
	public List<Usuario> getUsuarios() {
		if(usuarios == null){
			listarUsuarios();
		}
		return usuarios;
	}

	private void listarUsuarios() {
		setUsuarios(usuarioService.listar());
	}
		
		
	public String atualizar() {
		usuario.setGrupos(grupos.getTarget());
    	usuarioService.atualizar(usuario);
    	FacesUtil.mostrarMensagemSucesso("usuario.alterar.sucesso");
    	return "/paginas/usuario/listarUsuario";
    }
	
	public void alterarUsuario(){
		String idUsuario = FacesUtil.getRequestParameter("idUsuario");
		Long id = Long.valueOf(idUsuario);
		usuario = usuarioService.buscar(id);
		inicializarGruposAlteracao();
	}

	private void inicializarGruposAlteracao() {
		List<Grupo> gruposSelecionados = usuario.getGrupos();
		List<Grupo> gruposNaoSelecionados = grupoService.listar();
		gruposNaoSelecionados.removeAll(gruposSelecionados);
		
		grupos = new DualListModel<Grupo>(gruposNaoSelecionados, gruposSelecionados);
	}
	
	
	public void listarPorNome() {
		usuarios = usuarioService.listarPorLogin(palavraChave);
	}
	
	public List<Pessoa> getPessoas() {
		if(pessoas == null) {
			pessoas = pessoaService.listar();
		}
		return pessoas;
	}
		
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public DualListModel<Grupo> getGrupos() {
		return grupos;
	}

	public void setGrupos(DualListModel<Grupo> grupos) {
		this.grupos = grupos;
	}

	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

	public String getPalavraChave() {
		return palavraChave;
	}

	public void setPalavraChave(String palavraChave) {
		this.palavraChave = palavraChave;
	}
}
